/* FileException.cpp
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 04/11/2017
 *  Last Modified   : 04/11/2017
 * 
 */

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Dependencies
#include "PublicLibs/ConsoleIO/BasicIO.h"
#include "PublicLibs/ConsoleIO/Label.h"
#include "PublicLibs/ExportSafeLibs/Stream.h"
#include "PublicLibs/Exceptions/ExceptionSerialization.h"
#include "FileException.h"
namespace ymp{
namespace FileIO{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//#define YMP_PRINT_ON_EXCEPTION
//#define YMP_FATAL_ON_EXCEPTION
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
YMP_EXCEPTION_DEFINITIONS(FileException)
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
FileException::FileException(const char* function, std::string path, std::string message)
    : m_function(function == nullptr ? "" : function)
    , m_message(std::move(message))
    , m_path(std::move(path))
    , m_code(0)
{
#ifdef YMP_PRINT_ON_EXCEPTION
    FileException::print();
#endif
#ifdef YMP_FATAL_ON_EXCEPTION
    std::terminate();
#endif
}
FileException::FileException(int code, const char* function, std::string path, std::string message)
    : m_function(function == nullptr ? "" : function)
    , m_message(std::move(message))
    , m_path(std::move(path))
    , m_code(code)
{
#ifdef YMP_PRINT_ON_EXCEPTION
    FileException::print();
#endif
#ifdef YMP_FATAL_ON_EXCEPTION
    std::terminate();
#endif
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void FileException::print() const{
    Console::println("\n", 'R');
    Console::println_labelc("Exception Encountered", get_typename());
    Console::println();
    if (!m_function.empty()){
        Console::println_labelm("In Function:", m_function);
    }
    if (m_code != 0){
        Console::println_labelm("Error Code: ", m_code);
    }
    Console::println_labelm(8, "Path: ", m_path);
    Console::println();
    Console::println(m_message);
    Console::println("\n");
    Console::set_color('w');
}
FileException::FileException(SerializationPassKey key, const char*& stream)
    : Exception(key, stream)
{
    ExceptionTools::parse(stream, m_function);
    ExceptionTools::parse(stream, m_message);
    ExceptionTools::parse(stream, m_path);
    ExceptionTools::parse(stream, m_code);
}
void FileException::serialize(std::string& stream) const{
    Exception::serialize(stream);
    ExceptionTools::write(stream, m_function);
    ExceptionTools::write(stream, m_message);
    ExceptionTools::write(stream, m_path);
    ExceptionTools::write(stream, m_code);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
}
